网络 > csharp AOT中的XML序列化
2025-04-02
玩具项目引入序列化后,开始体会到CSharp的AOT的蛋疼了。所以也明白CSharp之父做的TSChekcer为啥要用golang不用csharp了。
两门语言对待AOT的优先级上的确不同,CSharp的AOT只是能用,绝对不是优势。
实现,CSharp开启AOT后,反射的功能就开始受限,这对于序列化的影响很大,解决方案是必须显示的指定可能用到的类。
第一个会出现的错误是,报找不到空参数构造函数。
---> System.InvalidOperationException: HellMapManager.Models.Map cannot be serialized because it does not have a parameterless constructor.
本质是因为没有指定可能使用的类型(以及子类中可能没指定)。
需要引入
using System.Diagnostics.CodeAnalysis;
然后在类定义中显示的指明
public partial class Map
{
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Map))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(MapInfo))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Alias))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Room))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Exit))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Route))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Variable))]
[DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(Landmark))]
然后可能遇到的问题是提示
---> System.InvalidOperationException: You must implement a default accessor on System.Collections.Generic.List`1[[HellMapManager.Models.Room, HellMapManager, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] because it inherits from ICollection.
这是需要在使用XML元素的地方显式指定类型
[XmlArray(ElementName = "Rooms")]
[XmlArrayItem(typeof(Room))]
public List<Room> Rooms { get; set; } = [];
继续写,继续踩坑。
点击登录